package com.wjl.shop.service.impl;

import com.wjl.shop.entity.Dealer;
import com.wjl.shop.dao.DealerDao;
import com.wjl.shop.service.DealerService;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.crypto.interfaces.PBEKey;
import javax.xml.crypto.Data;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

/**
 * 经销商表(Dealer)表服务实现类
 *
 * @author makejava
 * @since 2021-10-07 14:07:23
 */
@Service("dealerService")
public class DealerServiceImpl implements DealerService {
    @Resource
    private DealerDao dealerDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public Dealer queryById(Integer id) {
        return this.dealerDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Dealer> queryAllByLimit(int offset, int limit) {
        return this.dealerDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param dealer 实例对象
     * @return 实例对象
     */
    @Override
    public Dealer insert(Dealer dealer) {
        this.dealerDao.insert(dealer);
        return dealer;
    }

    /**
     * 修改数据
     *
     * @param dealer 实例对象
     * @return 实例对象
     */
    @Override
    public Dealer update(Dealer dealer) {
        this.dealerDao.update(dealer);
        return this.queryById(dealer.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.dealerDao.deleteById(id) > 0;
    }


    /**
     * 经销商通过用户名和密码登录
     *
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @Override
    public Map<String, Object> dealerLogin(String username, String password) {
        Map<String, Object> map = new HashMap<>();
        Dealer dealer = dealerDao.dealerLogin(username, password);
        if (dealer != null) {
            map.put("code", 0);
            map.put("message", "登录成功");
            map.put("data", dealer);
        } else {
            map.put("code", 1);
            map.put("data", false);
            map.put("message", "账号或密码错误");
        }
        return map;
    }

    /**
     * 根据经销商名称查找关联的经销商
     *
     * @param name
     * @return
     */
    @Override
    public Map<String, Object> findByName(String name) {
        List<Dealer> list = dealerDao.findByDealerName(name);
        Map<String, Object> map = new HashMap<>();
        if (list != null) {
            map.put("message", "查询成功");
            map.put("code", 0);
            map.put("data", list);
        } else {
            map.put("message", "该经销商无关联信息或不存在该经销商");
            map.put("code", 0);
            map.put("data", list);
        }
        return map;
    }


    /**
     * 查询表中是否有对应信息的用户
     *
     * @param dealer
     * @return 是否成功的信息
     */
    @Override
    public Map<String, Object> isName(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();
        List query = this.dealerDao.queryAll(dealer);
        if (query.isEmpty()) {
            map.put("code", 0);
            map.put("flag", true);
            map.put("message", "账号中没有此用户，可以创建");
        } else {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "用户名存在");
        }
        return map;
    }

    /**
     * 查询经销商信息
     *
     * @param dealer
     * @return 返回是否成功的信息和数据
     */
    @Override
    public Map<String, Object> queryBoss(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();
        List a = this.dealerDao.queryBoss(dealer);
        map.put("status", "ok");
        map.put("message", "查询成功!");
        map.put("data", a);

        return map;
    }

    /**
     * 创建经销商信息
     *
     * @param dealer
     * @return 是否成功的信息
     */
    @Override
    @Transactional
    public Map<String, Object> createDealer(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();
        dealer.setCreateTime(new Date()); //获取当前时间为创建时间
        dealer.setStatus(1);             // 默认开启账号
        dealer.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));   //默认密码为123456
        dealer.setIntegral(100);                       //默认信誉分为100
        dealer.setCredits(10000.0);                     //默认信用额度为10000.0元
        if (dealer.getDealerName() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "经销商名不能为空！");
            return map;
        }
        if (dealer.getPhone() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码不能为空！");
            return map;
        }
        if (checkNumber(dealer.getPhone())) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码格式不正确！");
            return map;
        }
        if (dealer.getPhone().length() != 11) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码长度不正确！");
            return map;
        }
        if (dealer.getUsername() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "用户名不能为空！");
            return map;
        }
        if (dealer.getContact() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "联系人不能为空！");
            return map;
        }

        if (dealer.getEmail() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "电子邮箱不能为空！");
            return map;
        }
        if(checkEmail(dealer.getEmail())){
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "电子邮箱格式不正确！");
            return map;
        }

            try {
                StringBuffer buffer = new StringBuffer("JXS");
                buffer.append(System.currentTimeMillis());
                dealer.setDealerCode(buffer.toString());
                this.dealerDao.insertBoss(dealer);
                map.put("code", 0);
                map.put("flag", true);
                map.put("message", "创建账号成功！");

            } catch (Exception e) {
                e.printStackTrace();
                map.put("code", 1);
                map.put("flag", false);
                map.put("message", "创建账号失败！请确认账号是否已存在！");
            }
            return map;
    }


    /**
     * 删除经销商信息
     *
     * @param dealer
     * @return 是否成功的信息
     */
    @Override
    @Transactional
    public Map<String, Object> deleteDealer(Dealer dealer) {

        Map<String, Object> map = new HashMap<>();
        Integer id = dealer.getId();

        if (this.dealerDao.deleteById(id) >= 1) {
            map.put("code", 0);
            map.put("flag", true);
            map.put("message", "经销商信息删除成功！");
        } else {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "经销商信息删除失败！");
        }
        return map;
    }


    /**
     * 通过用户名查询账户信息
     *
     * @param username
     * @return
     */
    @Override
    public Map<String, Object> findAccountInfo(String username) {
        Dealer dealer = dealerDao.findAccountInfo(username);
        Map<String, Object> map = new HashMap<>();
        if (dealer != null) {
            map.put("message", "查询成功");
            map.put("code", 0);
            map.put("data", dealer);
        } else {
            map.put("message", "查询失败");
            map.put("code", 1);
            map.put("data", dealer);
        }
        return map;
    }


    /**
     * 检查密码是否一致（修改密码模块）
     *
     * @param username
     * @param password
     * @return
     */
    @Override
    public Map<String, Object> checkPassword(String username, String password, String newPassword, String confirm) {
        Map<String, Object> map = new HashMap<>();
        boolean result;
        Dealer dealer = this.dealerDao.checkPassword(username, password);
        if (dealer != null) {
            if (newPassword.equals(confirm)) {
                result = updatePassword(username, confirm);
                map.put("message", "修改成功");
                map.put("code", 0);
                map.put("data", result);
            } else {
                result = false;
                map.put("message", "确认密码不一致");
                map.put("code", 1);
                map.put("data", result);
            }
        } else {
            map.put("message", "密码不一致");
            map.put("code", 1);
            map.put("data", false);
        }
        return map;
    }

    /**
     * 修改密码
     *
     * @param username
     * @param confirm
     * @return
     */
    @Override
    public Boolean updatePassword(String username, String confirm) {
        this.dealerDao.updatePassword(username, confirm);
        return true;
    }

    /**
     * 重置密码
     *
     * @param dealer
     * @return是否成功
     */
    @Override
    @Transactional
    public Map<String, Object> rePassword(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();
        Dealer a = new Dealer();
        a.setUsername(dealer.getUsername());
        a.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        if (this.dealerDao.rePassword(a) == 1) {
            map.put("code", 0);
            map.put("message", "密码重置成功!");
            map.put("flag", true);
        } else {
            map.put("code", 1);
            map.put("message", "密码重置失败!");
            map.put("flag", false);
        }

        return map;
    }

    /**
     * 关联经销商信息
     *
     * @param dealer
     * @return 返回是否成功
     */
    @Override
    @Transactional
    public Map<String, Object> relationDealer(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();
        Dealer a = new Dealer();
        a.setId(dealer.getId());
        a.setPickname(dealer.getPickname());
        a.setCommunity(dealer.getCommunity());
        a.setArea(dealer.getArea());
        a.setSendMoney(dealer.getSendMoney());
        a.setCountMoney(dealer.getCountMoney());
        a.setPaidMoney(dealer.getPaidMoney());
        try {
            this.dealerDao.update(a);
            map.put("code", 0);
            map.put("flag", true);
            map.put("message", "关联信息成功！");

        } catch (Exception e) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "关联信息失败！");
        }
        return map;
    }

//判断字符串是否为纯数字的方法
    public static boolean checkNumber(String str) {
        for (int i = 0; i < str.length(); i++) {
            System.out.println(str.charAt(i));
            if (!Character.isDigit(str.charAt(i))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 更改经销商信息
     *
     * @param dealer
     * @return是否成功
     */
    @Override
    @Transactional
    public Map<String, Object> updateDealer(Dealer dealer) {
        Map<String, Object> map = new HashMap<>();

        Dealer a = new Dealer();
        a.setId(dealer.getId());
        a.setUpdateTime(new Date());//获取当前时间为修改时间
        a.setUpdatePeople(dealer.getUpdatePeople());
        a.setPhone(dealer.getPhone());
        a.setDealerName(dealer.getDealerName());
        a.setUsername(dealer.getUsername());
        a.setContact(dealer.getContact());
        a.setEmail(dealer.getEmail());
        a.setRemark(dealer.getRemark());
        if (dealer.getDealerName() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "经销商名不能为空！");
            return map;
        }
        if (checkNumber(dealer.getPhone())) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码格式不正确！");
            return map;
        }
        if (dealer.getPhone().length() != 11) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码长度不正确！");
            return map;
        }
        if (dealer.getUsername() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "用户名不能为空！");
            return map;
        }
        if (dealer.getContact() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "联系人不能为空！");
            return map;
        }
        if (dealer.getPhone() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "手机号码不能为空！");
            return map;
        }
        if (dealer.getEmail() == null) {
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "电子邮箱不能为空！");
            return map;
        }
        if(checkEmail(dealer.getEmail())){
            map.put("code", 1);
            map.put("flag", false);
            map.put("message", "电子邮箱格式不正确！");
            return map;
        }


        if (1 == 1) {

            try {
                this.dealerDao.update(a);
                map.put("code", 0);
                map.put("flag", true);
                map.put("message", "更新信息成功！");

            } catch (Exception e) {
                map.put("code", 1);
                map.put("flag", false);
                map.put("message", "更新信息失败！请确认信息格式是否正确！");
            }
            return map;
        }


        return map;

    }

    //判断邮箱格式是否正确
    public static boolean checkEmail(String email)
    {// 验证邮箱的正则表达式
        String format = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}";
        //p{Alpha}:内容是必选的，和字母字符[\p{Lower}\p{Upper}]等价。如：200896@163.com不是合法的。
        //w{2,15}: 2~15个[a-zA-Z_0-9]字符；w{}内容是必选的。 如：dyh@152.com是合法的。
        //[a-z0-9]{3,}：至少三个[a-z0-9]字符,[]内的是必选的；如：dyh200896@16.com是不合法的。
        //[.]:'.'号时必选的； 如：dyh200896@163com是不合法的。
        //p{Lower}{2,}小写字母，两个以上。如：dyh200896@163.c是不合法的。
        if (email.matches(format))
        {
            return false;// 邮箱名合法，返回false
        }
        else
        {
            return true;// 邮箱名不合法，返回true
        }
    }

}
